package com.employment.service;

import com.employment.entity.ChatConversation;
import com.employment.entity.ChatMessage;
import com.employment.entity.ChatParticipant;

import java.util.List;

/**
 * 聊天服务接口
 * 
 * @author Employment System
 * @since 1.0.0
 */
public interface ChatService {

    /**
     * 创建私聊会话
     *
     * @param userId1 用户1
     * @param userId2 用户2
     * @return 会话信息
     */
    ChatConversation createPrivateConversation(Long userId1, Long userId2);

    /**
     * 创建群聊会话
     *
     * @param creatorId    创建者ID
     * @param title        群聊标题
     * @param avatar       群聊头像
     * @param participantIds 参与者ID列表
     * @return 会话信息
     */
    ChatConversation createGroupConversation(Long creatorId, String title, String avatar, Long[] participantIds);

    /**
     * 获取用户会话列表
     *
     * @param userId 用户ID
     * @return 会话列表
     */
    List<ChatConversation> getUserConversations(Long userId);

    /**
     * 发送消息
     *
     * @param conversationId 会话ID
     * @param senderId       发送者ID
     * @param messageType    消息类型
     * @param content        消息内容
     * @param fileUrl        文件URL
     * @param fileName       文件名
     * @param fileSize       文件大小
     * @param locationInfo   位置信息
     * @return 消息信息
     */
    ChatMessage sendMessage(Long conversationId, Long senderId, Integer messageType, String content, 
                           String fileUrl, String fileName, Long fileSize, String locationInfo);

    /**
     * 获取会话消息列表
     *
     * @param conversationId 会话ID
     * @param page          页码
     * @param size          每页大小
     * @return 消息列表
     */
    List<ChatMessage> getConversationMessages(Long conversationId, Integer page, Integer size);

    /**
     * 标记消息为已读
     *
     * @param messageId 消息ID
     * @param userId    用户ID
     * @return 标记结果
     */
    boolean markAsRead(Long messageId, Long userId);

    /**
     * 撤回消息
     *
     * @param messageId 消息ID
     * @param userId    用户ID
     * @return 撤回结果
     */
    boolean recallMessage(Long messageId, Long userId);

    /**
     * 获取未读消息数量
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @return 未读消息数量
     */
    Integer getUnreadMessageCount(Long conversationId, Long userId);

    /**
     * 加入会话
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @param inviterId      邀请人ID
     * @return 加入结果
     */
    boolean joinConversation(Long conversationId, Long userId, Long inviterId);

    /**
     * 退出会话
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @return 退出结果
     */
    boolean leaveConversation(Long conversationId, Long userId);

    /**
     * 设置免打扰
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @param isMuted        是否免打扰
     * @return 设置结果
     */
    boolean setMuteStatus(Long conversationId, Long userId, boolean isMuted);

    /**
     * 设置置顶
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @param isTop          是否置顶
     * @return 设置结果
     */
    boolean setTopStatus(Long conversationId, Long userId, boolean isTop);

    /**
     * 删除会话
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @return 删除结果
     */
    boolean deleteConversation(Long conversationId, Long userId);

    /**
     * 获取会话参与者列表
     *
     * @param conversationId 会话ID
     * @return 参与者列表
     */
    List<ChatParticipant> getConversationParticipants(Long conversationId);

    /**
     * 搜索消息
     *
     * @param conversationId 会话ID
     * @param keyword        关键词
     * @param userId         用户ID
     * @return 消息列表
     */
    List<ChatMessage> searchMessages(Long conversationId, String keyword, Long userId);

    /**
     * 检查用户是否是会话参与者
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @return 是否是参与者
     */
    boolean isConversationParticipant(Long conversationId, Long userId);
    
    /**
     * 设置会话置顶
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @param isPinned       是否置顶
     */
    void pinConversation(Long conversationId, Long userId, Boolean isPinned);
    
    /**
     * 设置会话免打扰
     *
     * @param conversationId 会话ID
     * @param userId         用户ID
     * @param isMuted        是否免打扰
     */
    void muteConversation(Long conversationId, Long userId, Boolean isMuted);
}